import os
import shutil
from collections import defaultdict

def count_files_recursive(root_dir):
    """
    递归统计目录下所有文件的类型
    
    参数:
        root_dir: 根目录路径
    返回:
        defaultdict: 文件类型统计结果
        defaultdict: 文件路径统计结果
    """
    # 创建一个默认字典来存储文件类型统计
    file_type_count = defaultdict(int)
    file_paths = defaultdict(list)  # 存储每种类型文件的路径
    
    # 递归遍历目录
    for root, dirs, files in os.walk(root_dir):
        for filename in files:
            full_path = os.path.join(root, filename)
            # 获取文件扩展名
            _, extension = os.path.splitext(filename)
            # 将扩展名转换为小写以避免大小写差异
            extension = extension.lower() if extension else '无扩展名'
            # 统计文件类型数量
            file_type_count[extension] += 1
            file_paths[extension].append(full_path)
            
            # 打印当前处理的文件路径（可选）
            # print(f"正在处理: {os.path.join(root, filename)}")
    
    return file_type_count, file_paths

def print_statistics(file_type_count):
    """
    打印统计结果
    """
    print("\n文件类型统计结果:")
    # 按文件数量降序排序
    sorted_stats = sorted(file_type_count.items(), key=lambda x: x[1], reverse=True)
    total_files = sum(count for _, count in sorted_stats)
    
    print(f"\n总文件数: {total_files}")
    print("\n各类型文件数量:")
    for file_type, count in sorted_stats:
        percentage = (count / total_files) * 100
        print(f"{file_type}: {count} 个文件 ({percentage:.2f}%)")

def organize_files_by_type(root_dir, file_paths):
    """按文件类型组织文件到不同目录"""
    # 创建分类目录
    classified_dir = os.path.join(os.path.dirname(root_dir), "分类文件")
    if not os.path.exists(classified_dir):
        os.makedirs(classified_dir)
        print(f"\n创建分类主目录: {classified_dir}")
    
    # 复制文件到对应类型的子目录
    for file_type, paths in file_paths.items():
        # 去掉文件类型前面的点号
        type_name = file_type[1:] if file_type.startswith('.') else file_type
        type_dir = os.path.join(classified_dir, type_name)
        
        # 创建类型子目录
        if not os.path.exists(type_dir):
            os.makedirs(type_dir)
            print(f"创建子目录: {type_dir}")
        
        # 复制文件
        for src_path in paths:
            try:
                # 获取目标文件路径
                filename = os.path.basename(src_path)
                dst_path = os.path.join(type_dir, filename)
                
                # 如果目标文件已存在，添加序号
                base, ext = os.path.splitext(filename)
                counter = 1
                while os.path.exists(dst_path):
                    new_filename = f"{base}_{counter}{ext}"
                    dst_path = os.path.join(type_dir, new_filename)
                    counter += 1
                
                # 复制文件
                shutil.copy2(src_path, dst_path)
                print(f"复制文件: {filename} -> {type_dir}")
                
            except Exception as e:
                print(f"复制文件失败 {src_path}: {str(e)}")
                continue

if __name__ == "__main__":
    # 指定根目录路径
    root_directory = r"E:\文件\简历"
    
    try:
        print(f"开始统计目录: {root_directory}")
        
        # 统计文件并获取文件路径
        file_stats, file_paths = count_files_recursive(root_directory)
        
        # 打印统计结果
        print_statistics(file_stats)
        
        # 询问用户是否要进行文件分类
        response = input("\n是否要按文件类型进行分类整理？(y/n): ")
        if response.lower() == 'y':
            print("\n开始文件分类...")
            organize_files_by_type(root_directory, file_paths)
            print("\n文件分类完成！")
        
    except Exception as e:
        print(f"处理过程中出错: {str(e)}")